package com.giacom.docx4j.motor;

import java.util.List;

import com.giacom.document.CtPlugin;
import com.giacom.document.CtRegra;
import com.giacom.document.Documento;
import com.giacom.docx4j.plugin.IMainDocumentPlugin;
import com.giacom.docx4j.regra.IDocumentoRegra;
import com.giacom.docx4j.xml.util.JaxbUtil;

/**
 * Motor do aplicativo onde é executada todas as fases do processo de verificação, regras e plugins
 * @author Sandro
 *
 */
public class Motor {

	//le o modelo
	
	//le o documento
	
	//compara com o modelo
	
	//verifica as regras
	
	//roda os plugins
	
	//exibe os resultados
	

	/**
	 * Executa a operacao
	 * @param modeloXML XML contendo o modelo, regras e plugins
	 * @param docx Arquivo docx final
	 * @throws Exception 
	 */
	public void executa(String modeloXML, String docx) throws Exception{
		
		// 1 - Carrega o modelo XML
		Documento modelo = JaxbUtil.carregaDocumento(modeloXML);
		
		// 2 - Le o documento word e converte para Documento
		Documento docFim = LeituraDocx.realizaLeitura(docx);
		
		// 3 - Compara o doc lido com o modelo
		if(!modelo.getCabecalho().getTituloDocumento().equals(docFim.getCabecalho().getTituloDocumento())){
			throw new Exception("O modelo XML e o documento lido sao diferentes");
		}

		//verifica outras caracteristicas
		
		
		// 4 - Executa as regras
		if(modelo.getRegras() != null && modelo.getRegras().getRegra() != null){
			List<CtRegra> regra = modelo.getRegras().getRegra();
			for (CtRegra r : regra) {
				IDocumentoRegra impl = (IDocumentoRegra) Class.forName(r.getNomeClasseImpl()).newInstance();
				impl.execute(r, modelo, docFim);
			}
		}
		
		// 5 - Executa os plugins
		if(modelo.getPlugins() != null && modelo.getPlugins().getPlugin() != null){
			List<CtPlugin> plugin = modelo.getPlugins().getPlugin();
			for (CtPlugin p : plugin) {
				IMainDocumentPlugin impl = (IMainDocumentPlugin) Class.forName(p.getNomeClasseImpl()).newInstance();
				impl.execute(p, modelo, docFim);
			}
		}
		
		// 6 - Exibe os resultados
		Resultado res = Resultado.getInstance();
		res.setDocumentoWord(docx);
		res.setModeloXML(modeloXML);
		res.exibeResultadoTexto();
		
	}
	
}
